package com.yht.weblog.admin.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yht.weblog.admin.model.vo.category.AddCategoryReqVO;
import com.yht.weblog.admin.model.vo.category.DeleteCategoryReqVO;
import com.yht.weblog.admin.model.vo.category.FindCategoryPageListReqVO;
import com.yht.weblog.admin.model.vo.category.FindCategoryPageListRspVO;
import com.yht.weblog.admin.service.AdminCategoryService;
import com.yht.weblog.common.domain.dos.ArticleCategoryRelDO;
import com.yht.weblog.common.domain.dos.CategoryDO;
import com.yht.weblog.common.domain.mapper.ArticleCategoryRelMapper;
import com.yht.weblog.common.domain.mapper.CategoryMapper;
import com.yht.weblog.common.enums.ResponseCodeEnum;
import com.yht.weblog.common.exception.BizException;
import com.yht.weblog.common.model.vo.SelectRspVO;
import com.yht.weblog.common.utils.PageResponse;
import com.yht.weblog.common.utils.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author: yht
 * @date: 2023/12/30 11:29
 * @description:
 **/
@Service
@Slf4j
public class AdminCategoryServiceImpl implements AdminCategoryService {

    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private ArticleCategoryRelMapper articleCategoryRelMapper;

    @Override
    public Response addCategory(AddCategoryReqVO addCategoryReqVO) {
        CategoryDO categoryDO = categoryMapper.selectByName(addCategoryReqVO.getName());
        if (Objects.nonNull(categoryDO)) {
            log.warn("分类名称：{} 已存在", addCategoryReqVO.getName());
            throw new BizException(ResponseCodeEnum.CATEGORY_NAME_IS_EXISTED);
        }
        // 构建分类 DO 对象
        CategoryDO insertCategoryDO = CategoryDO.builder()
                .name(addCategoryReqVO.getName().trim())
                .build();

        // 执行插入操作
        categoryMapper.insert(insertCategoryDO);

        return Response.success();
    }

    /**
     * 查询分类列表数据
     *
     * @param findCategoryPageListReqVO 请求的分类分页列表参数对象
     * @return 分页响应对象
     */
    @Override
    public PageResponse findCategoryPageList(FindCategoryPageListReqVO findCategoryPageListReqVO) {
        // 查询分类列表数据
        Page<CategoryDO> categoryDOPage = categoryMapper.selectPageList(findCategoryPageListReqVO.getCurrent(), findCategoryPageListReqVO.getSize(), findCategoryPageListReqVO.getName(), findCategoryPageListReqVO.getStartDate(), findCategoryPageListReqVO.getEndDate());

        List<CategoryDO> categoryDOS = categoryDOPage.getRecords();

        List<FindCategoryPageListRspVO> vos = null;
        // 如果categoryDOS集合不为空
        if (!CollectionUtils.isEmpty(categoryDOS)) {
            // 将categoryDOS转换为流
            vos = categoryDOS.stream()
                    // 对每一项进行处理，使用FindCategoryPageListRspVO的构建器创建FindCategoryPageListRspVO对象
                    .map(categoryDO -> FindCategoryPageListRspVO.builder()
                            // 设置id属性为categoryDO的id
                            .id(categoryDO.getId())
                            // 设置name属性为categoryDO的name
                            .name(categoryDO.getName())
                            // 设置createTime属性为categoryDO的createTime
                            .createTime(categoryDO.getCreateTime())
                            // 构建并返回FindCategoryPageListRspVO对象
                            .build())
                    // 将流转换为List集合
                    .collect(Collectors.toList());
        }

        // 返回分页数据
        return PageResponse.success(categoryDOPage, vos);
    }

    /**
     * 删除分类
     *
     * @param deleteCategoryReqVO
     * @return
     */
    @Override
    public Response deleteCategory(DeleteCategoryReqVO deleteCategoryReqVO) {
        Long categoryId = deleteCategoryReqVO.getId();

        ArticleCategoryRelDO articleCategoryRelDO = articleCategoryRelMapper.selectOneByCategoryId(categoryId);
        if (Objects.nonNull(articleCategoryRelDO)) {
            log.warn("==> 此分类下包含文章，无法删除， categoryId: {}", categoryId);
            throw new BizException(ResponseCodeEnum.CATEGORY_CAN_NOT_DELETE);
        }
        // 根据分类 ID 删除分类
        categoryMapper.deleteById(categoryId);
        return Response.success();
    }

    /**
     * 查询分类下拉列表数据
     *
     * @return
     */
    @Override
    public Response findCategorySelectList() {
        // 查询所有分类数据
        List<CategoryDO> categoryDOS = categoryMapper.selectList(null);

        List<SelectRspVO> selectRspVOS = null;
        // 如果分类数据不为空
        if (!CollectionUtils.isEmpty(categoryDOS)) {
            // 将查询结果中的 ID 和 name 属性封装到 SelectRspVO 对象中
            selectRspVOS = categoryDOS.stream()
                    .map(categoryDO -> SelectRspVO.builder()
                            .label(categoryDO.getName())
                            .value(categoryDO.getId())
                            .build())
                    .collect(Collectors.toList());
        }
        return Response.success(selectRspVOS);
    }
}
